package czStvDpds.mapmanagment;

import java.awt.Point;
import java.awt.Point;
import java.util.LinkedList;
import java.util.List;

/**
 * Představuje mapu. Tato třídá implementuje rozhraní Map2D, které obsahuje
 * základní metody potřebné pro používání mapy.
 *
 * @author Jirka
 */
public class Map implements AccesibleMap {

    /**
     * Dvourozměrné pole dlaždic. První rozměr/políčko je X, druhé Y
     */
    private Tile tiles[][];

    /**
     * Vrátí dlaždici na zadaných souřadnicích. Souřadnice jsou v dlaždicích.
     *
     * @param x
     * @param y
     * @return
     */
    public Tile getTile(int x, int y) {
        if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) {
            return null;
        } else {
            return tiles[x][y];
        }
    }

    /**
     * Nastaví dlaždici na zadaných souřadnicích na dlaždici zadanou v
     * parametrech. Souřadnice jsou v dlaždicích.
     *
     * @param x
     * @param y
     * @param tile
     */
    public void setTile(int x, int y, Tile tile) {
        tiles[x][y] = tile;
    }

    /**
     * Vrátí výšku mapy v dlaždicích
     *
     * @return
     */
    public int getWidth() {
        return tiles.length;
    }

    /**
     * Vrátí šířku mapy v dlaždicích
     *
     * @return
     */
    public int getHeight() {
        return tiles[0].length;
    }
    private static final int SPAWN_POINT_ID = 10; // Dočasné řešení

    /**
     * Vrátí náhodný spawn point.
     *
     * @return
     */
    public Point getRandomSpawnPoint() {
        List<Point> spawnPoint = new LinkedList<>();
        if (tiles != null) {
            for (int x = 0; x < getWidth(); x++) {
                for (int y = 0; y < getHeight(); y++) {
                    if (getTile(x, y).getId() == SPAWN_POINT_ID) {
                        spawnPoint.add(new Point(x, y));
                    }
                }
            }
            if (!spawnPoint.isEmpty()) {
                return spawnPoint.get((int) (Math.random() * spawnPoint.size()));
            }
        }
        return null;
    }

    /**
     * Vytvoří novou prázdnou mapu zadaných rozměrů. Dlaždice se musí nastavit
     * manuálně při nahrávání mapy
     *
     * @see MapLoader
     *
     * @param width
     * @param height
     */
    public Map(int width, int height) {
        tiles = new Tile[width][height];
    }
}
